/**
 * 弹幕功能
 * NCT
 */
/**
 * 参数：
 * 1、挂接页面元素
 * 2、字体及大小
 * 3、速度定义
 * 4、颜色取值
 * 
 */

;(function($) {
	var base = {
		getDataStamp: function(date) {
			if (date) {
				return parseInt(Date.parse(new Date(date)) / 1000);
			} else {
				return parseInt(Date.parse(new Date()) / 1000);
			}
		},
		quickSort: function(arr, cmp){
			//默认比较函数
			if (typeof cmp !== 'function') {
				cmp = function(arritem, pivot) {
					return arr[i]<=pivot;
				};
			}
			
            //如果数组<=1,则直接返回
            if(arr.length<=1){return arr;}
            var pivotIndex=Math.floor(arr.length/2);
            //找基准，并把基准从原数组删除
            var pivot=arr.splice(pivotIndex,1)[0];
            //定义左右数组
            var left=[];
            var right=[];

            //比基准小的放在left，比基准大的放在right
            for(var i=0;i<arr.length;i++){
                if(cmp(arr[i], pivot)){
                    left.push(arr[i]);
                }
                else{
                    right.push(arr[i]);
                }
            }
            //递归
            return this.quickSort(left).concat([pivot], this.quickSort(right));
       	},
	}
	
	window.barrage = {
		config: {
			name: 'test',					//标识名称
			id: '',
			//元素集
			eles: {
				hanging: 'body',
				msgItem: '<span class="barrageline"></span>',
			},
			styles: {
				key: '.barrageline',
				item: [
					'position: absolute',
					'z-index: 9999999999',
					'color: #fff',
					'white-space: nowrap'
				],
			},
			cmodel: 0,						//视频配合模式， 0: 直播； 1： 回放
			msg: {
				movemodel: 0,				//移动模式， 0:自右向左移动；1：自左向右移动
				fontlinesize: 20,			//文字行高度 
				fontsize: '12',				//字体大小
				fontsizeunit: 'px',			//文字大小单位
				speendtime: 20000,			//移动速度时间定义, 默认10秒
				speendtime_float_value: 5000,	//移动速度浮动值
				screenProportion: 30,		//消息显示屏幕占比
				msgLineDensity: 10,			//消息线密度
				color: [					//颜色数组
					'fff',
				],
				//回放消息过滤
				playBackFilter: {
					baseTime: 0,			//基准时间
					segment: null,			//过滤段
					segmentEncode: false,	//段加密					
				},
				playBack: {
					pageCount: 100,			//获取消息每页数据长度
				},
				getPlayBackMsg: function() {return [];},
				getPlayBackTime: function() {return -1;},
			},
			run: {
				model: 0,					//运行模式；0：正常，1： 测试，定时发送数据
				//调试用
				sendMsgSpeendTime: 3000,	//发送消息速度时间定义
				sendMsgTimeKey: 0,			//发送消息时间key
				
			},
			submit: {
				enable: false,				//使用
				url: '',					//上传服务器接口
				timeKey: 0,					//提交时间定义
				timeSpeend: 3000,			//上传触发时间
				msgsBufferCount: 100,		//上传消息缓存条数
				msgsMaxLimit: 1000,			//最大上传消息数量限制
			}
		},
		rundata: {
			runing: false,
		},
		msgs: {
			submit: [],						//提交
			lines: [],						//消息线
			playBackFilter: {
				baseTime: 0,
				segment: null,
			},
			playBack: {
				page: 0,
				curMsgPos: 0,
			}
		},
		//初始化
		init: function(params) {
			var self = this;
			self.config = $.extend(true, self.config, params);

			//写入样式
			$(self.config.eles.hanging).css('overflow', 'hidden');
			
			//消息行样式
			self.config.styles.item.push('font-size:' + self.config.msg.fontsize + self.config.msg.fontsizeunit);
			self.config.styles.item.push('line-height:' + self.config.msg.fontlinesize + self.config.msg.fontsizeunit);
			
			$('head').append('<style type="text/css">' + self.config.styles.key + '{' + self.config.styles.item.join(';') + '} </style>');
			
			//生成消息线
			self.makeMsgLines();
		},
		//消息弹出
		popMsg: function(msg) {
			var self = this,
				$msgItem = $(self.config.eles.msgItem),
				msgLine = self.getIdleMsgLine();

			if (!self.rundata.runing) {
				return;
			}

			var speendtime = Math.random() * parseInt(self.config.msg.speendtime_float_value);
			if (Math.random() * 10 > 5) {
				speendtime = parseInt(self.config.msg.speendtime) + speendtime;
			} else {
				speendtime = parseInt(self.config.msg.speendtime) - speendtime;
			}
			var colorIndex = parseInt(Math.random() * self.config.msg.color.length);
			
			//设置消息
			$msgItem.text(msg);
			//设置消息颜色样式
			$msgItem.css('color', '#' + self.config.msg.color[colorIndex]);
			//设置文字行通用样式
			$msgItem.css({
				//文字大小
				'font-size': '18px',
				'font-weight': '300',
				//文字行
				'top': msgLine.top,
			});
			
			//移交到提交消息
			self.toSubMsg(msg);
			//添加到窗口
			$msgItem.appendTo($(self.config.eles.hanging));

			//根据左右设定位置
			var lh = {left: $(self.config.eles.hanging).width() + parseInt(self.config.msg.fontlinesize),},
				rh = {left:  -$msgItem.width() - parseInt(self.config.msg.fontlinesize),};

			if (self.config.msg.movemodel == 0) {
				$msgItem.css(lh);
				$msgItem.animate(rh, speendtime, function() {
					self.delMsgItem($msgItem, msgLine);
				});
			} else
			if (self.config.msg.movemodel == 1) {
				$msgItem.css(rh);
				$msgItem.animate(lh, speendtime, function() {
					self.delMsgItem($msgItem, msgLine);
				});
			}
		},
		//添加消息到列表
		addMsg: function (msg) {
			this.msgs.pop.push(msg);
		},
		//移交到提交消息
		toSubMsg: function(msg) {
			//移交到提交消息表
			this.msgs.submit.push(msg);
		},
		//运行
		_run: function() {
			var self = this;
			self.rundata.runing = true;
			
			with (self.config) {
				//设置提交缓存消息
				if (submit.enable === true) {
					function setSubmitMsg() {
						submit.timeKey = setTimeout(function() {
							if (submit.msgsBufferCount < self.msgs.submit.length) {
								clearTimeout(submit.timeKey)
								self.submitMsg();
							}
							setSubmitMsg();
						}, submit.timeSpeend);
					}
					setSubmitMsg();
				}
				
				//调试模式开启模拟消息
				if (run.model == 1) {
					//添加消息显示调试窗口
					var $debugInfo = $('<div id="debugInfo" style="position: fixed;left: 0;top: 0;width: 100%;z-index: 99;color:#fff;background:#000;"></div>');
					$('body').append($debugInfo);
					for(var key in self.msgs.lines) {
						$debugInfo.append('<span id="msgline'+ key +'"></span>');
					}
					//输出调试信息
					run.sendMsgTimeKey = setInterval(function() {
						var sendmsg = '测试消息' + Date.parse(new Date());
						self.popMsg(sendmsg);
						
						self.updateMsgLineInfo();
						
					}, run.sendMsgSpeendTime);
				}
				
				//设置消息回放
				if (cmodel == 1) {
					self.playBackMsg();
				}
			}
		},
		_stop: function() {
			var self = this;
			self.rundata.runing = false;
			
			with (self.config) {
				//停止调试发送消息
				clearInterval(run.sendMsgTimeKey);
				//停止消息记录
				if (submit.enable === true) {
					clearInterval(submit.timeKey);
				}
				//消息回放时间自行管理，不必在此手动停止
			}
		},
		run: function(k) {
			(k)?this._run():this._stop();
		},
		delMsgItem: function(ele, msgLine) {
			var self = this;
			//删除消息
			ele.remove();
			//删除时间线消息数量
			if (msgLine.key >= 0) {
				self.msgs.lines[msgLine.key].msgcot--;
			}
			
			if (self.config.run.model == 1) {
				self.updateMsgLineInfo();
			}
		},
		//生成消息线
		makeMsgLines: function() {
			var self = this;
			var sh = $(self.config.eles.hanging).height();
			var msgLH = sh * (self.config.msg.screenProportion / 100);
			var msgLC = parseInt(msgLH / self.config.msg.msgLineDensity);
			
			for (var i=0;i<msgLC;i++) {
				self.msgs.lines.push({
					top: i * self.config.msg.msgLineDensity + 5,
					msgcot: 0,
				});
			}
		},
		//获取显示消息线
		getIdleMsgLine: function() {
			var self = this,
				lineKey = -1,
				line = {top: 0, msgcot: 99999999999},
				lines = self.msgs.lines;

			for (var key in lines) {
				if (line.msgcot > lines[key].msgcot) {
					//console.log(line);
					lineKey = key;
					line.msgcot = lines[key].msgcot;
					
					if (line.msgcot == 0) {
						break;
					}
				}
			}
			
			if (lineKey) {
				lines[lineKey].msgcot++;
				line = lines[lineKey];
			}
			line.key = lineKey;
			return line;
		},
		//刷新时间线调试信息
		updateMsgLineInfo: function() {
			var self = this;
			
			for(var key in self.msgs.lines) {
				$('#msgline' + key).text(self.msgs.lines[key].msgcot);
			}
		},
		//提交记录的消息
		submitMsg: function() {
			
		},
		//计算弹出回放消息，并返回下次计算时间
		calcPopPlayBackMsg: function(msgs, filter) {
			var c = this.config;
			//获取当前播放时间
			console.log('calc getPlayBackTime');
			var playTime = c.msg.getPlayBackTime(this);
			return;
			
			//循环消息，设置定时发送,并记录已提交的消息
			rmsg.curMsgPos = msgTop;
			$.each(array, function() {
				//非运行状态退出发送消息
				if (!self.rundata) {
					return false;
				}
				
				//popMsg();
			});
			
		},		
		//回放消息
		playBackMsg: function() {
			var self = this,
				c = this.config,
				rmsg = this.msgs;
			//解码消息过滤段
			with (c.msg.playBackFilter) {
				//基准时间
				if (baseTime != 0) {
					rmsg.playBackFilter.baseTime = base.getDataStamp(baseTime);
				}
				
				//过滤段
				var p = rmsg.playBackFilter;
				if (segment != null && segment != '') {
					p.segment = JSON.parse(decodeURI(segment));
					
					for (var k in p.segment) {
						p.segment[k].startTime = base.getDataStamp(p.segment[k].startTime);
						p.segment[k].endTime = base.getDataStamp(p.segment[k].endTime);
						p.segment[k].valid = true;						
					}
				}
				
				//排序过滤段
				base.quickSort(p.segment, function(arritem, pivot) {
					return arritem.startTime <= pivot.startTime;
				});
			}
			
			console.log(rmsg);
			
			function popPlayBackMsg(outtime, msgTop) {
				var playBackTime = setTimeout(function() {
					clearTimeout(playBackTime);

					c.msg.getPlayBackMsg(msgTop, c.msg.playBack.pageCount, function(mlist, nextMsgTop) {
						console.log(mlist, nextMsgTop);
						
						//计算能弹出的消息，并返回下次响应消息时间
						console.log('call calc');
						var nextTime = self.calcPopPlayBackMsg(mlist, c.msg.segment);
						
						//停止运行， 退出
						if (!self.rundata) {
							return;	
						}
						
						//设定下次获取消息时间
						//popPlayBackMsg(nextTime, nextMsgTop);
						//popPlayBackMsg(1000, nextMsgTop);
					});
					
				}, outtime);
			};
						
			if (rmsg.curMsgPos > 0) {
				//curMsgPos不为0则为续播，从上次获取处继续
				popPlayBackMsg(500, rmsg.curMsgPos);
			} else {
				//获取第一页消息获取消息总数
				c.msg.getPlayBackMsg(0, 5, function(rl, msgTopFirst) {
					if (rl.length > 0) {
						popPlayBackMsg(500, msgTopFirst);
					}
				});
			}
		}
		
	}
})(jQuery);


